import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

// +----------+--------------+------+-----+---------+----------------+
// | Field    | Type         | Null | Key | Default | Extra          |
// +----------+--------------+------+-----+---------+----------------+
// | blogId   | int(11)      | NO   | PRI | NULL    | auto_increment |
// | title    | varchar(256) | YES  |     | NULL    |                |
// | content  | text         | YES  |     | NULL    |                |
// | postTime | datetime     | YES  |     | NULL    |                |
// | userId   | int(11)      | YES  |     | NULL    |                |
// +----------+--------------+------+-----+---------+----------------+
// 以下的 JDBC 操作都是根据 表结构 来操作的.

// 封装 针对博客表的一系列数据库操作.
public class BlogDao {
    // 1. 插入一个博客到博客中. ---> 发布博客.
    public void insert (Blog blog) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // a. 和数据库建立连接. 建立连接的时候 就有了数据源. 这是封装好了的.
            connection = DBUtil.getConnection();

            // b. 构造 sql
            String sql = "insert into blog values(null, ?, ?, now(), ?)";
            statement = connection.prepareStatement(sql);
            // 将 博客标题 填入 sql 第一个 ? 处.
            statement.setString(1,blog.getTitle());
            // 将 博客正文 填入 sql 第一个 ? 处.
            statement.setString(2,blog.getContent());
            // 将 创作博客的用户id 填入 sql 第一个 ? 处.
            statement.setInt(3,blog.getUserId());

            // c. 执行 sql (插入是调用 executeUpdate )
            int ret = statement.executeUpdate();
            // executeUpdate 返回值表示影响到几行.
            if (ret != 1)
                System.out.println("博客插入失败!");
            else
                System.out.println("博客插入成功!");

            // d. 释放资源.(已经封装好了.)
            // [注意]: 释放资源 不应该放在这, 因为前面的操作一旦发生了异常,
            //        这里就执行不到了. 应该放到 finally 中.
            // DBUtil.close(connection,statement,null);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // d. 释放资源.(已经封装好了.)
            DBUtil.close(connection,statement,null);
        }
    }

    // 2. 根据博客id查询指定博客. ---> 博客详情页.
    public Blog selectOne(int blogId) {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            // a. 和数据库建立连接. 建立连接的时候 就有了数据源. 这是封装好了的.
            connection = DBUtil.getConnection();

            // b. 构造 sql
            String sql = "select * from blog where blogId = ?";
            statement = connection.prepareStatement(sql);
            statement.setInt(1,blogId);

            // c. 执行sql (查询是调用 executeQuery )
            resultSet = statement.executeQuery();

            // d. 遍历结果集合. (此处只有一个结果)
            if (resultSet.next()) {
                Blog blog = new Blog();

                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                blog.setContent(resultSet.getString("content"));
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                blog.setUserId(resultSet.getInt("userId"));

                return blog;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,resultSet);
        }

        return null;
    }

    // 3. 直接查询博客列表. ---> 博客列表页.
    public List<Blog> selectAll() {
        List<Blog> blogs = new ArrayList<>();
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            // a. 和数据库建立连接. 建立连接的时候 就有了数据源. 这是封装好了的.
            connection = DBUtil.getConnection();

            // b. 构造 sql
            String sql = "select * from blog order by postTime desc";
            statement = connection.prepareStatement(sql);

            // c. 执行sql
            resultSet = statement.executeQuery();

            // d. 遍历结果集合.
            while (resultSet.next()) {
                Blog blog = new Blog();

                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));


                String content = resultSet.getString("content");
                if(content.length() > 100) {
                    content = String.format("%s...", content.substring(0, 100));
                }
                blog.setContent(content);

                blog.setPostTime(resultSet.getTimestamp("postTime"));
                blog.setUserId(resultSet.getInt("userId"));

                blogs.add(blog);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,resultSet);
        }

        return blogs;
    }

    // 4. 删除指定博客.  ---> 删除博客.
    public void delete (int blogId) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // a. 和数据库建立连接. 建立连接的时候 就有了数据源. 这是封装好了的.
            connection = DBUtil.getConnection();

            // b. 构造 sql
            String sql = "delete from blog where blogId = ?";
            statement = connection.prepareStatement(sql);
            statement.setInt(1,blogId);

            // c. 执行 sql (删除是调用 executeUpdate)
            int ret = statement.executeUpdate();
            // executeUpdate 返回值表示影响到几行.
            if (ret != 1)
                System.out.println("删除插入失败!");
            else
                System.out.println("删除插入成功!");

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // d. 释放资源.(已经封装好了.)
            DBUtil.close(connection,statement,null);
        }
    }

}
